package mx.unam.acatlan.poo.rps;

import mx.unam.acatlan.poo.rps.player.Agent;
import mx.unam.acatlan.poo.tournament.Tournament;



/**
 * Un movimiento que puede realizar un {@link Agent} durante un {@link RPSRecord}
 * PPT.
 * 
 * <p style="text-align: justify">
 * El propósito de esta clase es definir constantes que identifican los tres
 * movements permitidos dentro de un juego PPT: {@link Movement#PIEDRA},
 * {@link Movement#PAPEL}, y {@link Movement#TIJERAS}. Adicionalmente,
 * la constante {@link Movement#NULO} indica que no se realizo ningún
 * movimiento.
 * </p>
 * <p style="text-align: justify">
 * Estas constantes pueden ser utilizadas para indicar un movimiento durante un
 * juego mediante {@link Enfrentamiento#setMovimiento(Movement)}, o para conocer el
 * movimiento realizado por el contrario en alguno de sus juegos pasados,
 * utilizando {@link RPSRecord#getMovimiento()}.
 * </p> 
 * <p style="text-align: justify">
 * Por diseño (ya que no tiene sentido), esta clase no debe ser instanciada ni
 * heredada. Para evitar ser instanciada, {@link Movement} declara su
 * constructor como privado. Para evitar ser heredada, es declarada como final.
 * </p>
 * 
 * @author Carlos Alegria Galicia
 * @see Tournament
 */
public final class Movement {

	/**
	 * Constante que identifica un movimiento "piedra" dentro de un juego PPT.
	 */
	public static final Movement PIEDRA = new Movement();
	
	/**
	 * Constante que identifica un movimiento "papel" dentro de un juego PPT.
	 */
	public static final Movement PAPEL = new Movement();
	
	/**
	 * Constante que identifica un movimiento "tijeras" dentro de un juego PPT.
	 */
	public static final Movement TIJERAS = new Movement();
	
	/**
	 * Constante que identifica que un jugador no especifico ningún movimiento
	 */
	public static final Movement NULO  = new Movement();
	
	/**
	 * Constructor por default (i.e., sin argumentos)
	 * 
	 * Es declarado privado para impedir que la clase {@link Movement} sea
	 * instanciada.
	 */
	private Movement() {
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		if (this == Movement.PIEDRA) {
			return "PIEDRA";
		}
		if (this == Movement.PAPEL) {
			return "PAPEL";
		}
		if (this == Movement.TIJERAS) {
			return "TIJERAS";
		}
		return "NULO";
	}
}
